/**
 * 权限控制服务
 * 用于管理基于角色的访问控制
 */

// 角色常量
export const ROLES = {
  ADMIN: '管理员',
  SUBJECT_LEADER: '学科组长',
  TEACHER: '教师'
}

// 角色ID常量
export const ROLE_IDS = {
  ADMIN: 1,
  SUBJECT_LEADER: 2,
  TEACHER: 3
}

/**
 * 检查用户是否有权限访问特定路由
 * @param {Object} userInfo - 用户信息
 * @param {String} routeName - 路由名称
 * @returns {Boolean} - 是否有权限
 */
export function hasRoutePermission(userInfo, routeName) {
  // 如果没有用户信息，则没有权限
  if (!userInfo || !userInfo.roleName) {
    return false
  }
  
  // 管理员拥有所有权限
  if (userInfo.roleName === ROLES.ADMIN) {
    return true
  }
  
  // 根据角色和路由名称判断权限
  switch (userInfo.roleName) {
    case ROLES.SUBJECT_LEADER:
      // 学科组长可以访问控制台、学科管理、个人设置
      return ['Dashboard', 'Subject', 'SubjectDetail', 'Profile'].includes(routeName)
    case ROLES.TEACHER:
      // 教师可以访问控制台、学科管理、个人设置
      return ['Dashboard', 'Subject', 'SubjectDetail', 'Profile'].includes(routeName)
    default:
      return false
  }
}

/**
 * 检查用户是否有权限访问特定学科
 * @param {Object} userInfo - 用户信息
 * @param {Number|String} subjectId - 学科ID
 * @returns {Boolean} - 是否有权限
 */
export function hasSubjectPermission(userInfo, subjectId) {
  // 如果没有用户信息，则没有权限
  if (!userInfo || !userInfo.roleName) {
    return false
  }
  
  // 管理员拥有所有学科权限
  if (userInfo.roleName === ROLES.ADMIN) {
    return true
  }
  
  // 学科组长和教师只能访问自己所属的学科
  if (userInfo.roleName === ROLES.SUBJECT_LEADER || userInfo.roleName === ROLES.TEACHER) {
    // 如果用户没有学科信息，则没有权限
    if (!userInfo.subjectName) {
      return false
    }
    
    // 如果是按ID检查，需要将subjectId转为字符串进行比较
    if (subjectId) {
      return userInfo.subjects.some(subject => subject.subjectId === Number(subjectId));
    }
    
    return true
  }
  
  return false
}

/**
 * 检查用户是否有权限执行特定功能
 * @param {Object} userInfo - 用户信息
 * @param {String} feature - 功能名称
 * @returns {Boolean} - 是否有权限
 */
export function hasFeaturePermission(userInfo, feature) {
  // 如果没有用户信息，则没有权限
  if (!userInfo || !userInfo.roleName) {
    return false
  }
  
  // 管理员拥有所有功能权限
  if (userInfo.roleName === ROLES.ADMIN) {
    return true
  }
  
  // 根据角色和功能名称判断权限
  switch (userInfo.roleName) {
    case ROLES.SUBJECT_LEADER:
      // 学科组长可以执行所有学科相关功能
      return true
    case ROLES.TEACHER:
      // 教师只能执行组卷管理和试题管理功能
      return ['paper', 'question'].includes(feature.toLowerCase())
    default:
      return false
  }
}

/**
 * 检查用户是否有编辑权限
 * @param {Object} userInfo - 用户信息
 * @param {String} operation - 操作类型：'edit_subject'(学科编辑), 'manage_question_type'(题型管理), 'manage_knowledge'(知识点管理)
 * @returns {Boolean} - 是否有编辑权限
 */
export function hasEditPermission(userInfo, operation) {
  // 如果没有用户信息，则没有权限
  if (!userInfo || !userInfo.roleName) {
    return false
  }
  
  // 管理员拥有所有编辑权限
  if (userInfo.roleName === ROLES.ADMIN) {
    return true
  }
  
  // 根据角色和操作类型判断权限
  switch (userInfo.roleName) {
    case ROLES.SUBJECT_LEADER:
      // 学科组长可以执行所有编辑操作
      return true
    case ROLES.TEACHER:
      // 教师不能执行任何编辑操作
      return false
    default:
      return false
  }
}

/**
 * 获取用户可访问的导航菜单
 * @param {Object} userInfo - 用户信息
 * @returns {Array} - 可访问的菜单项
 */
export function getAccessibleMenus(userInfo) {
  // 如果没有用户信息，则返回空数组
  if (!userInfo || !userInfo.roleName) {
    return []
  }
  
  // 基础菜单项（所有角色都可访问）
  const baseMenus = [
    { index: 'dashboard', title: '控制台', icon: 'Odometer' }
    // { index: 'profile', title: '个人设置', icon: 'Setting' }
  ]
  
  // 根据角色返回不同的菜单
  switch (userInfo.roleName) {
    case ROLES.ADMIN:
      // 管理员可以访问所有菜单
      return [
        ...baseMenus,
        { index: 'subject', title: '学科管理', icon: 'Collection' },
        { index: 'question', title: '试题管理', icon: 'Document' },
        { index: 'paper', title: '组卷管理', icon: 'Files' },
        { index: 'role', title: '角色管理', icon: 'UserFilled' },
        { index: 'user', title: '用户管理', icon: 'User' },
        {index: 'classes', title: '班级管理', icon: 'School'},
        { index: 'teacher-classes-subject', title: '单位分配', icon: 'Lock' },
        { index: 'profile', title: '个人设置', icon: 'Setting' }
      ]
    case ROLES.SUBJECT_LEADER:
      // 学科组长可以访问学科管理
      return [
        ...baseMenus,
        { index: 'subject', title: '学科管理', icon: 'Collection' },
        { index: 'profile', title: '个人设置', icon: 'Setting' }
      ]
    case ROLES.TEACHER:
      // 教师可以访问学科管理
      return [
        ...baseMenus,
        { index: 'subject', title: '学科管理', icon: 'Collection' },
        { index: 'profile', title: '个人设置', icon: 'Setting' }
      ]
    default:
      return baseMenus
  }
}